#region Copyright notice and license

// Copyright 2019 The gRPC Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#endregion

using System.Diagnostics;
using System.Runtime.InteropServices;
using Server.Services;

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddGrpc();
builder.Services.AddSpaStaticFiles(configuration =>
{
    configuration.RootPath = "ClientApp/dist";
});
builder.Services.AddCors(o => o.AddPolicy("AllowAll", builder =>
{
    builder.AllowAnyOrigin()
           .AllowAnyMethod()
           .AllowAnyHeader()
           .WithExposedHeaders("Grpc-Status", "Grpc-Message", "Grpc-Encoding", "Grpc-Accept-Encoding");
}));

var app = builder.Build();
if (app.Environment.IsDevelopment())
{
    var indexPage = "ClientApp/dist/index.html";
    if (!File.Exists(indexPage))
    {
        using var p = RunNpmScript("build:prod");
        p.WaitForExit();
    }
}
else
{
    app.UseHsts();
}

app.UseDefaultFiles();
app.UseStaticFiles();
app.UseSpaStaticFiles();
app.UseRouting();
app.UseCors();

app.UseGrpcWeb();

app.MapGrpcService<GreeterService>()
    .RequireCors("AllowAll")
    .EnableGrpcWeb();

app.UseSpa(spa =>
{
    if (app.Environment.IsDevelopment())
    {
        RunNpmScript("build:watch");
    }
});

app.Run();

static Process RunNpmScript(string script)
{
    var fileName = "npm";
    var args = $"run {script}";
    if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
    {
        fileName = "cmd";
        args = $"/c npm {args}";
    }

    return Process.Start(new ProcessStartInfo
    {
        FileName = fileName,
        Arguments = args,
        WorkingDirectory = "ClientApp",
    })!;
}
